import os
import hashlib


def hash_file(filename):
    """
    计算文件的MD5哈希值。

    为了处理大文件，该函数以块的方式读取文件内容，
    并使用MD5哈希函数更新文件的每一部分，
    最终返回整个文件的MD5哈希值。

    参数:
    filename (str): 需要计算哈希值的文件名。

    返回:
    str: 文件的MD5哈希值。
    """
    # 初始化MD5哈希对象
    h = hashlib.md5()

    # 打开文件，以二进制模式读取
    with open(filename, 'rb') as file:
        # 循环读取文件块，直到文件结束
        while chunk := file.read(8192):
            # 更新哈希对象，处理当前块的内容
            h.update(chunk)

    # 返回文件的MD5哈希值
    return h.hexdigest()


def find_duplicates(folder):
    """
    在指定文件夹中查找重复文件。

    通过遍历文件夹中的所有文件，并计算每个文件的哈希值来识别重复文件。
    如果发现具有相同哈希值的文件，则认为这些文件是重复的。

    参数:
    folder (str): 要查找重复文件的文件夹路径。
    """
    # 初始化一个字典来存储文件的哈希值和对应的文件路径
    hashes = {}

    # 使用os.walk遍历指定文件夹中的所有目录和文件
    for dirpath, _, filenames in os.walk(folder):
        for f in filenames:
            # 拼接得到文件的完整路径
            full_path = os.path.join(dirpath, f)
            # 计算文件的哈希值
            file_hash = hash_file(full_path)
            # 检查当前文件的哈希值是否已经存在于字典中
            if file_hash in hashes:
                # 如果存在，说明找到了重复文件，打印重复文件的路径
                print(f"发现重复文件: {full_path} == {hashes[file_hash]}")
            else:
                # 如果不存在，将当前文件的哈希值和路径添加到字典中
                hashes[file_hash] = full_path


find_duplicates('./')
